PostgreSQL 数据库性能 HugePages
1 背景知识
当postgresql 所在的服务器内存大于32GB时,建议开启大页内存。
cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages: 10240 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
从结果中看到,尽管大页面的大小设置为2048kB,但大页面的总数为0,这表示当前设置为禁用了大页面。
2 启用大页内存
2.1 设置大页内存的数量
sudo sysctl -w vm.nr_hugepages=76
//屏幕输出:
vm.nr_hugepages = 76
Note
这里设置的大页内存数量为76,表示 76*2M=152MB
的内存用于大页内存。
2.2 查看大页内存的数量
cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages: 10240 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 76
HugePages_Free: 76
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 155648 kB
当 (HugePages_Free = HugePages_Total)时,没有程序在使用大页内存。
3 配置数据库使用大页内存
3.1 配置大页内存参数
vi $PGDATA/postgresql.conf
--------------------input------------------------------
huge_pages=on;
3.2 重启数据库
pg_ctl restart
3.3 查看大页内存的数量
cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages: 10240 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 76
HugePages_Free: 68
HugePages_Rsvd: 64
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 155648 kB
postgresql 启动时使用了少量的大页内存。
3.4 插入大量数据
CREATE TABLE test02(id int);
CREATE TABLE
INSERT INTO test02 values(generate_series(1,10000000));
INSERT 0 10000000
3.5 查看大页内存的数量
cat /proc/meminfo | grep -i huge
//屏幕输出:
AnonHugePages: 10240 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 76
HugePages_Free: 5
HugePages_Rsvd: 1
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 155648 kB
插入大量数据之后,大部分大页内存都在使用中。
4 小结
注意:此处使用的大页面的样本值非常低,不适用于大型生产环境。请评估系统所需的页数,并根据系统工作负载和资源进行相应设置。